/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package application;

import controleur.ConstantesWeb;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Usager
 */
public class Facade {

    public boolean creerCookiesIdentification(final String user, final String pwd, final HttpServletResponse res) {
        boolean connexionValide;
        ResultSet set = MembreDAO.getMembre(user, pwd);

        connexionValide = creerCookiesIdentification(set, res);

        return connexionValide;
    }

    public void enleverCookiesIdentification(final HttpServletRequest req, final HttpServletResponse res) {
        Cookie[] cookies = req.getCookies();

        for (int i = 0; i < cookies.length; i++) {
            if (cookies[i].getName().equals(ConstantesWeb.COOKIE_MEMBRE_NOM_UTILISATEUR)
                    || cookies[i].getName().equals(ConstantesWeb.COOKIE_MEMBRE_MOT_PASSE)) {
                cookies[i].setMaxAge(0);
                res.addCookie(cookies[i]);
            }
        }
    }

    public MembreBean getMembre(final Cookie[] cookies) {
        String nomUtilisateur = "";
        String motPasse = "";
        MembreBean mBean = null;
        List<MembreBean> membresBeanListe;

        for (int i = 0; i < cookies.length; i++) {
            if (cookies[i].getName().equals(ConstantesWeb.COOKIE_MEMBRE_NOM_UTILISATEUR)) {
                nomUtilisateur = cookies[i].getValue();
            } else if (cookies[i].getName().equals(ConstantesWeb.COOKIE_MEMBRE_MOT_PASSE)) {
                motPasse = cookies[i].getValue();
            }
        }

        if (!nomUtilisateur.equals("") && !motPasse.equals("")) {
            ResultSet set = MembreDAO.getMembre(nomUtilisateur, motPasse);
            membresBeanListe = getMembres(set);

            if (membresBeanListe.isEmpty()) {
                mBean = null;
            } else {
                mBean = membresBeanListe.get(0);
            }
        }
        return mBean;
    }

    public MembreBean getMembre(final String idMembre) {
        MembreBean mBean = null;
        List<MembreBean> membresBeanListe;
        ResultSet set = MembreDAO.getMembre(idMembre);
        membresBeanListe = getMembres(set);

        if (membresBeanListe.isEmpty()) {
            mBean = null;
        } else {
            mBean = membresBeanListe.get(0);
        }
        return mBean;
    }

    public List<LivreBean> getLivres() {
        ResultSet set = LivreDAO.getLivres();

        return getLivres(set);
    }

    public String getCoteMoyenne(final String isbn) {
        ResultSet set = CritiqueDAO.getCoteMoyenne(isbn);

        return getCoteMoyenne(set);
    }

    public List<CritiqueBean> getCritiqueLivres(final String isbn) {
        List<CritiqueBean> critiquesBeanListe;
        ResultSet set = CritiqueDAO.getCritiquesLivre(isbn);

        critiquesBeanListe = getCritiques(set);

        return critiquesBeanListe;
    }

    public boolean verifierCritiqueExiste(final String isbn, final String idMembre) {
        boolean critiqueExistante = false;
        ResultSet set = CritiqueDAO.getCritiqueMembre(isbn, idMembre);

        try {
            if (set.first()) {
                critiqueExistante = true;
            }
        } catch (SQLException ex) {
            critiqueExistante = false;
        }
        return critiqueExistante;
    }

    public LivreBean getLivre(final String isbn) {
        List<LivreBean> livresBeanListe;
        LivreBean lBean;
        ResultSet set = LivreDAO.getLivre(isbn);

        livresBeanListe = getLivres(set);

        if (livresBeanListe.isEmpty()) {
            lBean = null;
        } else {
            lBean = livresBeanListe.get(0);
        }
        return lBean;
    }

    public List<AuteurBean> getAuteurs() {
        ResultSet set = AuteurDAO.getAuteurs();

        return getAuteurs(set);
    }

    public VillePaysBean getVillePays(final String idVille) {
        List<VillePaysBean> villesPaysBeanListe;
        VillePaysBean vpBean;
        ResultSet set = VillePaysDAO.getVillePays(idVille);

        villesPaysBeanListe = getVillesPays(set);

        if (villesPaysBeanListe.isEmpty()) {
            vpBean = null;
        } else {
            vpBean = villesPaysBeanListe.get(0);
        }
        return vpBean;
    }

    public AuteurBean getAuteur(final String idAuteur) {
        List<AuteurBean> auteursBeanListe;
        AuteurBean aBean;
        ResultSet set = AuteurDAO.getAuteur(idAuteur);

        auteursBeanListe = getAuteurs(set);

        if (auteursBeanListe.isEmpty()) {
            aBean = null;
        } else {
            aBean = auteursBeanListe.get(0);
        }
        return aBean;
    }

    public AuteurBean getAuteurLivre(final String isbn) {
        List<AuteurBean> auteursBeanListe;
        AuteurBean aBean;
        ResultSet set = AuteurDAO.getAuteurLivre(isbn);

        auteursBeanListe = getAuteurs(set);

        aBean = auteursBeanListe.get(0);

        return aBean;
    }

    public List<LivreBean> getLivresAuteurListe(String idAuteur) {
        List<LivreBean> livresBeanListe;
        ResultSet set = LivreDAO.getLivresAuteurListe(idAuteur);

        livresBeanListe = getLivres(set);

        return livresBeanListe;
    }

    public String getTypeValeur(final String id) {
        String typeValeur;
        ResultSet set = TypeDAO.getValeur(id);

        typeValeur = getTypeValeur(set);

        return typeValeur;
    }

    public List<VillePaysBean> getVillesPays() {
        ResultSet set = VillePaysDAO.getVillesPays();

        return getVillesPays(set);
    }

    public int ecrireCritique(final CritiqueBean c) {
        int rowResults = CritiqueDAO.ecrireCritique(c);

        return rowResults;
    }

    public int supprimerCritique(final String idCritique) {
        int rowResults = CritiqueDAO.supprimerCritique(idCritique);

        return rowResults;
    }

    public ImageBean getImage(final String id) {
        List<ImageBean> imagesBeanListe;
        ImageBean iBean = null;
        ResultSet set = ImageDAO.getImage(id);

        imagesBeanListe = getImages(set);

        if (!imagesBeanListe.isEmpty()) {
            iBean = imagesBeanListe.get(0);
        }

        return iBean;
    }

    public int updateMembre(final HttpServletRequest req, final HttpServletResponse res) {
        int rowResults = 0;
        MembreBean m = creerMembreModifie(req);

        rowResults = MembreDAO.updateMembre(m);

        if (rowResults != 0) {
            creerCookiesIdentification(m.getNomUtilisateur(), m.getMotPasse(), res);
        }
        return rowResults;
    }

    public FileInputStream creerFichier(final String fichier) throws FileNotFoundException {
        File f = new File(fichier);
        FileInputStream fin = new FileInputStream(f);

        return fin;
    }

    public int updateImage(final FileInputStream fin, final String idMembre) {
        int rowResults = ImageDAO.updateImage(fin, idMembre);

        return rowResults;
    }

    public List<CommandeBean> getCommandesOuvertesMembre(String idMembre) {
        List<CommandeBean> commandesBeanListe;
        ResultSet set = CommandeDAO.getCommandesOuvertesMembre(idMembre);

        commandesBeanListe = getCommandes(set);

        for (CommandeBean c : commandesBeanListe) {
            c.setEmprunts(getLivresCommandes(c.getIdCommande()));
            c.setFacture(calculerFacture(c.getNombreJoursRetard(), c.getEmprunts()));
        }
        return commandesBeanListe;
    }

    public double calculerFactureTotale(final List<CommandeBean> commandesListe) {
        double factureTotale = 0;

        for (CommandeBean c : commandesListe) {
            factureTotale += c.getFacture();
        }
        return factureTotale;
    }
    
    public List<CommandeBean> getCommandesOuvertes() {
        List<CommandeBean> commandesBeanListe;
        ResultSet set = CommandeDAO.getCommandesOuvertes();

        commandesBeanListe = getCommandes(set);

        for (CommandeBean c : commandesBeanListe) {
            c.setEmprunts(getLivresCommandes(c.getIdCommande()));
            c.setFacture(calculerFacture(c.getNombreJoursRetard(), c.getEmprunts()));
        }
        return commandesBeanListe;
    }
    
    public List<MembreBean> getMembres() {
        ResultSet set = MembreDAO.getMembres();

        return getMembres(set);
    }

    private double calculerFacture(int nombreJoursRetard, final List<LivreBean> emprunts) {
        double facture = 0;
        double coutParJour = 0;

        if (nombreJoursRetard <= ConstantesWeb.NOMBRES_JOUR_1) {
            coutParJour = ConstantesWeb.COUT_PAR_JOUR_1;
        } else if (nombreJoursRetard <= ConstantesWeb.NOMBRES_JOUR_2) {
            coutParJour = ConstantesWeb.COUT_PAR_JOUR_2;
            facture += calculerCoutBase(ConstantesWeb.COUT_BASE_2, emprunts.size());
        } else {
            coutParJour = ConstantesWeb.COUT_PAR_JOUR_3;
            facture += calculerCoutBase(ConstantesWeb.COUT_BASE_3, emprunts.size());
            facture += calculerCoutRemplacement(emprunts);
        }
        facture += calculerFactureCommande(nombreJoursRetard, coutParJour, emprunts.size());

        return facture;
    }

    private double calculerFactureCommande(final int nombreJours, final double coutParJour, final int nombreLivresEmpruntes) {
        return nombreJours * coutParJour * nombreLivresEmpruntes;
    }
    
    private double calculerCoutBase(final double coutBase, final int nombreLivresEmpruntes) {
        return coutBase * nombreLivresEmpruntes;
    }

    private double calculerCoutRemplacement(final List<LivreBean> emprunts) {
        double coutRemplacementTotal = ConstantesWeb.COUT_ADMINISTRATIVES;
        double coutRemplacement;


        for (LivreBean e : emprunts) {
            try {
                coutRemplacement = Double.parseDouble(e.getCoutRemplacement());
            } catch (NumberFormatException ex) {
                coutRemplacement = ConstantesWeb.COUT_ADMINISTRATIVES;
            }
            coutRemplacementTotal += coutRemplacement;
        }
        return calculerTaxes(coutRemplacementTotal);
    }

    private double calculerTaxes(final double montant) {
        double montantAvecTPS;
        double montantTotal;

        montantAvecTPS = montant + montant * ConstantesWeb.TPS;
        montantTotal = montantAvecTPS + montantAvecTPS * ConstantesWeb.TVQ;

        return montantTotal;
    }

    private List<LivreBean> getLivresCommandes(final String idCommande) {
        List<LivreBean> livresBeanListe;
        ResultSet set = LivreDAO.getLivresCommande(idCommande);

        livresBeanListe = getLivres(set);

        return livresBeanListe;
    }

    private boolean creerCookiesIdentification(final ResultSet set, final HttpServletResponse res) {
        boolean connexionValide = false;

        try {
            if (set != null) {
                if (set.first()) {
                    res.addCookie(new Cookie(ConstantesWeb.COOKIE_MEMBRE_NOM_UTILISATEUR, set.getString("nom_utilisateur")));
                    res.addCookie(new Cookie(ConstantesWeb.COOKIE_MEMBRE_MOT_PASSE, set.getString("motPasse")));
                    connexionValide = true;
                } else {
                    connexionValide = false;
                }
            }
        } catch (Exception e) {
        }
        return connexionValide;
    }

    private List<MembreBean> getMembres(final ResultSet set) {
        List<MembreBean> membresBeanListe = new ArrayList<MembreBean>();

        try {
            if (set != null) {
                while (set.next()) {
                    Membre m = new Membre();

                    m.setAdresse(set.getString("adresse"));
                    m.setCourriel(set.getString("courriel"));
                    m.setIdMembre(set.getString("id_membre"));
                    m.setMotPasse(set.getString("motPasse"));
                    m.setNomFamille(set.getString("nom_de_famille"));
                    m.setNomUtilisateur(set.getString("nom_utilisateur"));
                    m.setPrenom(set.getString("prenom"));
                    m.setTelephone(set.getString("telephone"));
                    m.setIdVille(set.getString("id_ville"));
                    m.setIdCompte(set.getString("id_compte"));
                    m.setIdImage(set.getString("id_image"));

                    membresBeanListe.add(m.getMembreBean());
                }
            }
        } catch (Exception e) {
        }
        return membresBeanListe;
    }

    private String getCoteMoyenne(final ResultSet set) {
        String coteMoyenne = "";

        try {
            if (set != null) {
                if (set.first()) {
                    coteMoyenne = set.getString("cote_moyenne");

                    if (coteMoyenne == null) {
                        coteMoyenne = "Aucune cote";
                    } else {
                        Double coteMoyenneDouble = Math.round(Double.parseDouble(coteMoyenne) * 10.0) / 10.0;

                        if (coteMoyenneDouble == 10) {
                            coteMoyenne = "10/10";
                        } else {
                            coteMoyenne = String.valueOf(coteMoyenneDouble) + "/10";
                        }
                    }
                }
            }
        } catch (Exception e) {
        }
        return coteMoyenne;
    }

    private List<CritiqueBean> getCritiques(final ResultSet set) {
        List<CritiqueBean> critiquesBeanListe = new ArrayList<CritiqueBean>();

        try {
            if (set != null) {
                while (set.next()) {
                    Critique c = new Critique();

                    c.setCote(set.getString("cote"));
                    c.setCritique(set.getString("critique"));
                    c.setIdCritique(set.getString("id_critique"));
                    c.setIdMembre(set.getString("id_membre"));
                    c.setIsbn(set.getString("isbn"));

                    critiquesBeanListe.add(c.getCritiqueBean());
                }
            }
        } catch (Exception e) {
        }
        return critiquesBeanListe;
    }

    private List<LivreBean> getLivres(final ResultSet set) {
        List<LivreBean> livresBeanListe = new ArrayList<LivreBean>();

        try {
            if (set != null) {
                while (set.next()) {
                    Livre l = new Livre();

                    l.setDatePublication(set.getString("date_de_publication"));
                    l.setDescription(set.getString("description"));
                    l.setIdImage(set.getString("id_image"));
                    l.setIsbn(set.getString("isbn"));
                    l.setTitre(set.getString("titre"));
                    l.setIdEtat(set.getString("id_etat"));
                    l.setCoutRemplacement(set.getString("cout_de_remplacement"));

                    livresBeanListe.add(l.getLivreBean());
                }
            }
        } catch (Exception e) {
        }
        return livresBeanListe;
    }

    private List<VillePaysBean> getVillesPays(final ResultSet set) {
        List<VillePaysBean> villesPaysListe = new ArrayList<VillePaysBean>();

        try {
            if (set != null) {
                while (set.next()) {
                    VillePaysBean vpBean = new VillePaysBean();

                    vpBean.setIdPays(set.getString("id_pays"));
                    vpBean.setIdVillePays(set.getString("id_ville_pays"));
                    vpBean.setVille(set.getString("ville"));

                    villesPaysListe.add(vpBean);
                }
            }
        } catch (Exception e) {
        }
        return villesPaysListe;
    }

    private List<AuteurBean> getAuteurs(final ResultSet set) {
        List<AuteurBean> auteursBeanListe = new ArrayList<AuteurBean>();

        try {
            if (set != null) {
                while (set.next()) {
                    Auteur a = new Auteur();

                    a.setBiographie(set.getString("biographie"));
                    a.setDateDeces(set.getString("date_de_deces"));
                    a.setDateNaissance(set.getString("date_de_naissance"));
                    a.setIdAuteur(set.getString("id_auteur"));
                    a.setIdImage(set.getString("id_image"));
                    a.setIdVille(set.getString("id_lieu_de_naissance"));
                    a.setNomFamille(set.getString("nom_de_famille"));
                    a.setPrenom(set.getString("prenom"));

                    auteursBeanListe.add(a.getAuteurBean());
                }
            }
        } catch (Exception e) {
        }
        return auteursBeanListe;
    }

    private String getTypeValeur(final ResultSet set) {
        String typeValeur = "";

        try {
            if (set != null) {
                if (set.first()) {
                    typeValeur = set.getString("valeur");
                }
            }
        } catch (Exception e) {
        }
        return typeValeur;
    }

    private List<ImageBean> getImages(final ResultSet set) {
        List<ImageBean> imagesBeanListe = new ArrayList<ImageBean>();

        try {
            if (set != null) {
                while (set.next()) {
                    Image i = new Image();

                    i.setId(set.getString("id_image"));
                    i.setImage(set.getBlob("image"));

                    imagesBeanListe.add(i.getImageBean());
                }
            }
        } catch (Exception e) {
        }
        return imagesBeanListe;
    }

    private MembreBean creerMembreModifie(final HttpServletRequest req) {
        Membre m = new Membre();
        String nouveauMotPasse;

        if (!req.getParameter("pwd-nouveau-1").equals("")) {
            nouveauMotPasse = req.getParameter("pwd-nouveau-1");
        } else {
            nouveauMotPasse = req.getParameter("pwd-ancien");
        }

        m.setAdresse(req.getParameter("adresse"));
        m.setCourriel(req.getParameter("courriel"));
        m.setIdMembre(req.getParameter("idMembre"));
        m.setMotPasse(nouveauMotPasse);
        m.setNomFamille(req.getParameter("nom"));
        m.setNomUtilisateur(req.getParameter("nomUtilisateur"));
        m.setPrenom(req.getParameter("prenom"));
        m.setTelephone(req.getParameter("telephone"));
        m.setIdVille(req.getParameter("idVillePays"));

        return m.getMembreBean();
    }

    private List<CommandeBean> getCommandes(final ResultSet set) {
        List<CommandeBean> commandesBeanListe = new ArrayList<CommandeBean>();

        try {
            if (set != null) {
                while (set.next()) {
                    Commande c = new Commande();

                    int nombreJoursRetard = set.getInt("difference_dates");

                    if (nombreJoursRetard < 0) {
                        nombreJoursRetard = 0;
                    }

                    c.setDateCommande(set.getString("date_de_commande"));
                    c.setDateRetour(set.getString("date_de_retour"));
                    c.setIdCommande(set.getString("id_commande"));
                    c.setIdEtat(set.getString("id_etat"));
                    c.setIdMembre(set.getString("id_membre"));
                    c.setNombreJoursRetard(nombreJoursRetard);

                    commandesBeanListe.add(c.getCommandeBean());
                }
            }
        } catch (Exception e) {
        }
        return commandesBeanListe;
    }
}